#include <stdint.h>
#include <math.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include "MLX90640_API.h"

#define MLX_I2C_ADDR 0x33

#define SENSOR_W 24
#define SENSOR_H 32

// Valid frame rates are 1, 2, 4, 8, 16, 32 and 64
#define FPS 32

#define TA_SHIFT 8      //默认温度修正值

float emissivity = 0.9;     //发射率
static uint16_t eeMLX90640[832];        
//uint16_t frame[834];
//static float mlx90640To[768];
//float eTa;

paramsMLX90640 mlx90640;

/*测试.so文件
int wust_test(int value){
    int c = value++;
    printf("%d\n",value);
    printf("hello, world!\n");
    return c;
}*/

void Get_Temperature(float *mlx90) {
	
    switch(FPS){
        case 1:
            MLX90640_SetRefreshRate(MLX_I2C_ADDR, 0b001);
            break;
        case 2:
            MLX90640_SetRefreshRate(MLX_I2C_ADDR, 0b010);
            break;
        case 4:
            MLX90640_SetRefreshRate(MLX_I2C_ADDR, 0b011);
            break;
        case 8:
            MLX90640_SetRefreshRate(MLX_I2C_ADDR, 0b100);
            break;
        case 16:
            MLX90640_SetRefreshRate(MLX_I2C_ADDR, 0b101);
            break;
        case 32:
            MLX90640_SetRefreshRate(MLX_I2C_ADDR, 0b110);
            break;
        case 64:
            MLX90640_SetRefreshRate(MLX_I2C_ADDR, 0b111);
            break;
        default:
            printf("Unsupported framerate: %d", FPS);
    }
    
    MLX90640_SetChessMode(MLX_I2C_ADDR);        //测量分布模式为棋盘模式
    MLX90640_DumpEE(MLX_I2C_ADDR, eeMLX90640);      //此函数用于读取保存于EEPROM内的全部832个字的温度计算校准数据，保存于eeMLX90640数组内
    //此函数用来将MLX90640_DumpEE函数读取的所有 EEPROM 数据解析到定义于 MLX90640_API.h 中的自定义结构体变量中，此变量特别重要，是完成各种计算的必需参数
    MLX90640_ExtractParameters(eeMLX90640, &mlx90640);
       
/*  有问题，只能输出一半温度数据

    MLX90640_GetFrameData(MLX_I2C_ADDR, frame);

    eTa = MLX90640_GetTa(frame, &mlx90640);
    MLX90640_CalculateTo(frame, &mlx90640, emissivity, eTa, mlx90);

    MLX90640_BadPixelsCorrection((&mlx90640)->brokenPixels, mlx90, 1, &mlx90640);
    MLX90640_BadPixelsCorrection((&mlx90640)->outlierPixels, mlx90, 1, &mlx90640);

*/

    //2帧数据完成（即总共768个温度完成）再输出
    //1帧实际只有一半数据，另一半都为0
    while (1)
    {
        uint16_t frame[834];        //读取到的一帧实时数据

        MLX90640_GetFrameData(MLX_I2C_ADDR, frame);         //读取完整的一帧实时测量数据

        //float Vdd = MLX90640_GetVdd(frame, &mlx90640);      //计算并返回 Vdd 电压值，判断传感器是否工作正常
        //printf("Vdd数值为：%.2f \n", Vdd);

        float Ta = MLX90640_GetTa(frame, &mlx90640);        //计算得到 Ta（MLX90640 外壳温度）

        float tr = Ta - TA_SHIFT;       //校正温度

        MLX90640_CalculateTo(frame, &mlx90640, emissivity, tr, mlx90);      //计算一帧温度值（768 像素点）。计算结果为浮点型，保存于 mlx90 数组内

        sleep(0.01);    //延时40ms等待另一半数据完成

        //棋盘模式，10个点数据都为0即判断只有一半数据
        if(((mlx90[0] >= -0.1 && mlx90[0] <= 0.1) &&
            (mlx90[2] >= -0.1 && mlx90[2] <= 0.1) &&
            (mlx90[4] >= -0.1 && mlx90[4] <= 0.1) &&
            (mlx90[6] >= -0.1 && mlx90[6] <= 0.1) &&
            (mlx90[8] >= -0.1 && mlx90[8] <= 0.1) &&
            (mlx90[72] >= -0.1 && mlx90[72] <= 0.1) &&
            (mlx90[136] >= -0.1 && mlx90[136] <= 0.1) &&
            (mlx90[200] >= -0.1 && mlx90[200] <= 0.1) &&
            (mlx90[264] >= -0.1 && mlx90[264] <= 0.1) &&
            (mlx90[328] >= -0.1 && mlx90[328] <= 0.1)) ||
            
            ((mlx90[1] >= -0.1 && mlx90[1] <= 0.1) &&
            (mlx90[3] >= -0.1 && mlx90[3] <= 0.1) &&
            (mlx90[5] >= -0.1 && mlx90[5] <= 0.1) &&
            (mlx90[7] >= -0.1 && mlx90[7] <= 0.1) &&
            (mlx90[9] >= -0.1 && mlx90[9] <= 0.1) &&
            (mlx90[73] >= -0.1 && mlx90[73] <= 0.1) &&
            (mlx90[137] >= -0.1 && mlx90[137] <= 0.1) &&
            (mlx90[201] >= -0.1 && mlx90[201] <= 0.1) &&
            (mlx90[265] >= -0.1 && mlx90[265] <= 0.1) &&
            (mlx90[329] >= -0.1 && mlx90[329] <= 0.1)))
        {
            //printf("into if");        //调试
        }

        else
        {
            //printf("into else");      //调试
            break;
        }
                        
    }

    MLX90640_BadPixelsCorrection((&mlx90640)->brokenPixels, mlx90, 1, &mlx90640);       //坏点修正
    MLX90640_BadPixelsCorrection((&mlx90640)->outlierPixels, mlx90, 1, &mlx90640); 

}
